package org.xurui.bsj.protocol.command.impl;

import org.hswebframework.web.bean.FastBeanCopier;
import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.codec.FromDeviceMessageContext;
import org.jetlinks.core.message.event.EventMessage;
import org.xurui.bsj.protocol.command.CmdCodec;
import org.xurui.bsj.protocol.enums.CommandEnum;
import org.xurui.bsj.protocol.msg.BsjMessage;
import org.xurui.bsj.protocol.utils.ArrayUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 4.1.10.健康参数上报
 */
public class CmdCodec_REPORT_HEALTH implements CmdCodec {
    @Override
    public boolean supportsCmd(String cmd) {
        return CommandEnum.REPORT_HEALTH.name().equals(cmd);
    }

    @Override
    public List<DeviceMessage> parsePayload(BsjMessage payload, FromDeviceMessageContext context) {
        //例子：[35380100360174,898600MFSSYYGXXXXXXP,201805082000001000, REPORT_HEALTH,3,20180528111820,25,0900-1000@123!156!90!99!@37.3@8278@H120L80!H120L80]
        /**
         * 报文体格式： 运动时间段 非运动模式，第一位传0
         *            @心率 心率参数:最高心率!最低心率！平均心率！实时心率 #实时心率#（实时心率最多80组，每一分钟采集一 次心率，长时间运动则需平均抽稀至80组）
         *            @温度 温度参数 平均温度（运动模式不采集） 温度保留一位小数 非运动时间段，或者未采集到该项数据则传0
         *            @计步 计步 运动开始后总步数，
         *            @血压 血压 H 代表高压 L 代表低压 例如H120L80 （运动模式下开始和结束分别采集一组）
         *            @血氧 血氧 （运动模式不采集） 例 如 0900-1000@123!156!90!99!@37.3@8278@H120L80!H120L80
         */
        //设备上报事件
        EventMessage eventMessage = new EventMessage();
        eventMessage.setDeviceId(payload.getHeader().getDeviceNo());
        eventMessage.setEvent(payload.getHeader().getCmd());
        eventMessage.setMessageId(payload.getHeader().getOrderNo());
        eventMessage.setTimestamp(System.currentTimeMillis());
        Map<String, Object> properties = new HashMap<>();
        String tempBody = payload.getTempBody();
        String[] tempBodyArr = tempBody.split("@");
        //properties.put("header", FastBeanCopier.copy(payload.getHeader(), HashMap::new));
        properties.put("header", payload.getHeader().toMap());

        /**
         * 运动时间段 0900-1000 非运动模式，第一位传0
         */
        properties.put("sportTime", ArrayUtils.getStrByIndex(tempBodyArr,0));
        /**
         * 心率 心率参数:最高心率!最低心率！平均心率！实时心率 #实时心率#（实时心率最多80组，每一分钟采集一 次心率，长时间运动则需平均抽稀至80组）
         */
        properties.put("heartRate",ArrayUtils.getStrByIndex(tempBodyArr,1));
        /**
         * 温度 温度参数 平均温度（运动模式不采集） 温度保留一位小数 非运动时间段，或者未采集到该项数据则传0
         */
        properties.put("temperature",ArrayUtils.getStrByIndex(tempBodyArr,2));
        /**
         * 计步 计步 运动开始后总步数，
         */
        properties.put("stepNum",ArrayUtils.getStrByIndex(tempBodyArr,3));
        /**
         * 血压 血压 H 代表高压 L 代表低压 例如H120L80 （运动模式下开始和结束分别采集一组）
         */
        properties.put("bloodPressure",ArrayUtils.getStrByIndex(tempBodyArr,4));
        /**
         * 血氧 （运动模式不采集） 例 如 0900-1000@123!156!90!99!@37.3@8278@H120L80!H120L80 温度保留一位小数 非运动时间段，或者未采集到该项数据则传0 非运动模式，第一位传0
         */
        properties.put("bloodOxygen",ArrayUtils.getStrByIndex(tempBodyArr,5));
        eventMessage.setData(properties);

        //回复消息
        //标识通信方向，取值如下: 1.下发请求 2.下发响应 3.上报请求 4.上报响应
        //说明：平台下发请求标示 1，则终 端响应标示为 2，终端上报接口标 示为 3，平台响应标示为 4
        //组装需要回复设备消息提
        /**
         * 报文体格式： 应答状态（0＝正常，1＝非平台用户，2＝其他异常）
         */
        //示例：[35380100360174,898600MFSSYYGXXXXXXP,201805082000001000, REPORT_HEALTH,4,20180528111820,1,0]
        payload.setTempReplyBody("0");
        return genDeviceMessage(eventMessage);
    }
}
